/*
	Copyright (C) 2013 Pontificia Universidad Catolica del Peru
	contact: http://avatar.inf.pucp.edu.pe/realidad-aumentada/
	address contact: Av. Universitaria 1801, San Miguel, Lima-Peru.
	
	This file is part of UbicAR PUCP.

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with This program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
	Author: Pedro Carrión Castagnola
	Pontificia Universidad Catolica del Peru
	Direccion de Informatica Academica
	
	Modified by: Alvaro Roger Agüero Sánchez, Rodolfo Javier Galvez Meza
	Pontificia Universidad Catolica del Peru
	Departamento de Ingeniería
*/

package org.grupoavatar.guiaubicua;

import java.util.List;

import org.grupoavatar.guiaubicua.entidades.ARMarker;
import org.grupoavatar.guiaubicua.mix.DataView;
import org.grupoavatar.guiaubicua.mix.Marker;
import org.grupoavatar.guiaubicua.mix.MixContext;
import org.grupoavatar.guiaubicua.mix.MixState;
import org.grupoavatar.guiaubicua.punto.EncuestaIntroScreen;
import org.grupoavatar.guiaubicua.punto.MasterActivity;
import org.grupoavatar.guiaubicua.punto.TabGeneral;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Window;
import android.widget.Toast;

public class VDownloading extends Activity {

	private static DataView dataView;
	private MixContext mixContext;

	private List<Marker> markerList;

	private boolean detenerDescarga;
	private boolean exito;
	private boolean interrumpir;

	private String sigV;
	private String textoBusqueda;
	
	@Override
	public void onConfigurationChanged(Configuration newConfig)
	{
	    super.onConfigurationChanged(newConfig);
	    setContentView(R.layout.downloading);
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.downloading);
		dataView = VInicial.dataView;
		mixContext = dataView.getContext();
		sigV = getIntent().getExtras().getString("sigV");
		if (sigV == null) // si se ha llamado mal a la clase
			finish();
		detenerDescarga = false;
		if (sigV.equals("busqueda"))	{
			VBusqueda.mostrarResultado = false;
			textoBusqueda = getIntent().getExtras().getString("textoBusqueda");
		}
		
		cargarListaPOI(this);
	}

	public void cargarListaPOI(final VDownloading vDownloading) {
		new Thread(new Runnable() {
			public void run() {
				Log.d(VInicial.TAG + "-HILO",
						"Inicia Thread de descarga de poi's");

				exito = true;
				interrumpir = false;
				while (!detenerDescarga) {
					if ((sigV.equals("busqueda")) && (textoBusqueda!= null) )	{
						markerList = dataView.setSearchMarkerList(textoBusqueda);
						if ((markerList == null) || (markerList.isEmpty())) {
							exito = false;
						}
					}
					else if (sigV.equals("poi"))	{
						String idPoi = getIntent().getExtras().getString("idPOI");
						if (!("setted".equals(idPoi)))	{
							if ((dataView.getDataHandler().getMarkerListTotal() == null) || (dataView.getDataHandler().getMarkerListTotal().size() < 1))
							{
								markerList = dataView.setDefaultMarkerList();
								if (dataView.getDataHandler().getMarkerListTotal().size() > 0) {
									VBusqueda.primeraConsulta = false;
								} else {
									exito = false;
								}
							}
							if (exito) {
								ARMarker poi = VInicial.dataView.getDataHandler().obtenerMarker(idPoi);
								if (poi == null)	{
									exito = false;
								}
								else	{
									//VPOI.setPoi((ArpucpPOIMarker) poi);
	//								TabGeneral.setPoi((ArpucpPOIMarker) poi);
	//								TabUbicacion.setPoi((ArpucpPOIMarker) poi);
	//								TabServicios.setPoi((ArpucpPOIMarker) poi);
									//MasterActivity.addPoi((ArpucpPOIMarker) poi);
									MasterActivity._poi = poi;
//									MasterActivity._markerListTemporal = null;
									MasterActivity._bpoi = null;
									MasterActivity._poiHijoAnterior = null;
								}
							}
						}
					} else if (sigV.equals("encuesta")) {
						String idPoi = getIntent().getExtras().getString("idPOI");
						EncuestaIntroScreen.encuesta = VInicial.dataView.getEncuesta(idPoi);
					}
					else	{
						if (VBusqueda.hayBusqueda) {
							markerList = dataView.getDataHandler().getMarkerList();
						} else {
							int estadoDescarga = VInicial.dataView.getEstado();
					        if (estadoDescarga != MixState.DONE) {
								markerList = dataView.setDefaultMarkerList();
								if ((markerList == null) || (markerList.isEmpty())) {
									exito = false;
								}
					        }
					        else	{
								markerList = dataView.getDataHandler().getMarkerList();
								if ((markerList == null) || (markerList.isEmpty())) {
									markerList = dataView.setDefaultMarkerList();
									if ((markerList == null) || (markerList.isEmpty())) {
										exito = false;
									}
								}
					        }
						}
					}			
					detenerDescarga = true;
				}

				// ok, file is downloaded,
				if (exito && !interrumpir) {
					Log.d(VInicial.TAG + "-HILO", "Terminó carga con éxito");
					mostrarResultados();
				} else {
					if (!interrumpir) { //exito y !interrumpir
						// no se interrumpio y no hubo éxito, 
						//pudo ser por error de conexion o porque no se encontraron resultados
						if (markerList == null)	{ //error de conexión
							Log.d(VInicial.TAG + "-HILO", "Hubo un error de conexión");
							vDownloading.runOnUiThread(new Runnable() {
								public void run() {
									Toast.makeText(
											mixContext,
											"Ocurrió un error, comprueba tu conexión a Internet y vuelve a intentarlo.",
											Toast.LENGTH_LONG).show();
								}
							});
						}
						else	{ //no se encontraron resultados
							//sólo debería suceder en busquedas o cuando alguna categoría no tiene ningun poi
							Log.d(VInicial.TAG + "-HILO", "No se encontraron resultados");
							if (sigV.equals("busqueda"))	{
								VBusqueda.mostrarResultado = true; //se muestra que no hay resultados
							}
//							//si alguna categoría no tiene ningun check
//				        	final String nmc = VInicial.getContext().noMarkersCheck();
//				        	if (nmc != null)	{
//				        		DataView.volverAFiltro = true;
//				        		vDownloading.runOnUiThread(new Runnable() {
//									public void run() {
//										Toast.makeText(VInicial.getContext(), nmc, Toast.LENGTH_LONG).show();
//									}
//								});
//				        	}
				        	mostrarResultados();
						}
					}
//					else	//sale por interrupción
					Log.d(VInicial.TAG + "-HILO", "Thread terminado");

				}
				vDownloading.finish();
			}

			private void mostrarResultados() {
				if (sigV.equals("mapa")) {
					startActivity(new Intent(VInicial.getContext(), VMapa.class));
				} else if (sigV.equals("lista")) {
					startActivity(new Intent(VInicial.getContext(), VLista.class));
				} else if (sigV.equals("ar")) {
					startActivity(new Intent(VInicial.getContext(), VAR.class));
				} else if ((sigV.equals("busqueda")) && (textoBusqueda == null) ) {
					startActivity(new Intent(VInicial.getContext(), VBusqueda.class));
				} else if ((sigV.equals("busqueda")) && (textoBusqueda != null) ) {
					VBusqueda.mostrarResultado = true;
				} else if (sigV.equals("poi") && exito) {
					//startActivity(new Intent(VInicial.getContext(), VPOI.class));
					startActivity(new Intent(VInicial.getContext(), TabGeneral.class));
				} else if (sigV.equals("encuesta")) {
					//startActivity(new Intent(VInicial.getContext(), VPOI.class));
					startActivity(new Intent(VInicial.getContext(), EncuestaIntroScreen.class));
				}
			}
		}).start();
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (!detenerDescarga) {
				detenerDescarga = true;
				interrumpir = true;
				Log.d(VInicial.TAG + "-HILO", "Carga interrumpida, terminando el thread...");
			}
			return super.onKeyDown(keyCode, event);
		}
		return false;
	}
}
